package gui;

import gui.Recebimento.ConfirmaRecebimento;
import gui.Recebimento.JanelaRecebimento;
import gui.Recebimento.PrincipalRecebimento;
import gui.Cubos.JanelaBi;
import gui.clientes.JanelaCadastroCliente;
import gui.clientes.JanelaPesquisaClientes;
import gui.item.JanelaCadastroItem;
import gui.relatorios.RelatorioVendasCliente;
import gui.venda.JanelaVenda;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JInternalFrame;

/**
 * JanelaFactory. Classe utilizada para definir as janelas que serão instanciadas a partir
 * <br>de um argumento passado por parâmetro. Este argumento é uma String contendo o caminho
 * <br>da janela na arvore de menus.
 * 
 * @author Vinicius
 */
public class JanelaFactory {

    //Atributos
    private JanelaPrincipal janelaPrincipal;
    private Map<String, Boolean> mapaControleJanelas;

    /**
     * Construtor da classe JanelaFactory. Deve possuir um parâmetro do tipo <code>JanelaPrincipal</code>
     * <br>para que as janelas obtenha acesso a janela principal.
     * 
     * @param janelaPrincipal 
     */
    public JanelaFactory(JanelaPrincipal janelaPrincipal)
    {    
        this.janelaPrincipal = janelaPrincipal;
        this.addCaminhosInMap();
    }

    /**
     * Adicionar caminhos existentes na Tree de Menus para um Map onde ao criar uma janela
     * <br>verificar se a mesma está aberta ou fechada.
     */
    private void addCaminhosInMap()
    {
        mapaControleJanelas = new HashMap<String, Boolean>();
        
        mapaControleJanelas.put("[Menu, Estilo, Cor do Fundo]", Boolean.FALSE);
        mapaControleJanelas.put("[Menu, Cadastro, Cliente]", Boolean.FALSE);
        mapaControleJanelas.put("[Menu, Pesquisa, Cliente]", Boolean.FALSE);
        mapaControleJanelas.put("[Menu, Cadastro, Item]", Boolean.FALSE);
        mapaControleJanelas.put("[Menu, Faturamento, Recebimento]", Boolean.FALSE);
        mapaControleJanelas.put("[Menu, Faturamento, Venda]", Boolean.FALSE);
        mapaControleJanelas.put("[Menu, Relatórios, Vendas por Cliente]", Boolean.FALSE);
        mapaControleJanelas.put("[Menu, Cubos, Cubo Faturamento]", Boolean.FALSE);
        //TODO
    }
    
    /**
     * Método onde retorna uma instancia de uma janela presente no sistema pelo caminho passado como parâmetro.
     * <br>Exemplo de caminho de janela: <pre>  "[Menu, Cadastro, Cliente]"</pre>
     * <br>O caminho pode ser encontrado pelo seguinte método da arvore de menus: <pre><code>  TREE.getSelectionPath();</code></pre>
     * 
     * <br>Este método possui uma validação para verificar se a janela já está aberta no sistema. Se estiver, a janela
     * <br>não será aberta:
     * <pre>  <code>if(this.mapaControleJanelas.get(caminhoTree) == Boolean.TRUE)<br>  return null;</code></pre>
     * 
     * @param caminhoTree
     * @return JInternalFrame
     */
    public JInternalFrame createJanela(String caminhoTree)
    {
        if(this.mapaControleJanelas.get(caminhoTree) == Boolean.TRUE)
        {
            return null;
        }
        //
          /* try {
            if (mapaControleJanelas.get(caminhoTree) == null) {
                return null;
            }

            janela = (JInternalFrame) Class.forName(mapaControleJanelas.get(caminhoTree).getClass().getName()).newInstance();
        } catch (ClassNotFoundException ex) {
            System.out.println("Janela não cadastrada!");
        } catch (InstantiationException insex) {
            System.out.println("Erro ao instanciar Janela!");
        } catch (IllegalAccessException illaex) {
            System.out.println("Acesso não permitido!");
        }*/
        
        JInternalFrame janela;
        switch(caminhoTree)
        {
            case "[Menu, Estilo, Cor do Fundo]":     janela = new JanelaCor(this.janelaPrincipal); break;
            case "[Menu, Cadastro, Cliente]":        janela = new JanelaCadastroCliente(this.janelaPrincipal); break;
            case "[Menu, Pesquisa, Cliente]":        janela = new JanelaPesquisaClientes(this.janelaPrincipal); break;
            case "[Menu, Cadastro, Item]":           janela = new JanelaCadastroItem(this.janelaPrincipal); break;
            case "[Menu, Faturamento, Recebimento]": janela = new PrincipalRecebimento(this.janelaPrincipal); break;
            case "[Menu, Faturamento, Venda]": janela = new JanelaVenda(this.janelaPrincipal); break;
            case "JanelaRecebimento":                janela = new JanelaRecebimento(this.janelaPrincipal); break;
            case "ConfirmaRecebimento": janela = new ConfirmaRecebimento(this.janelaPrincipal); break;
            case "[Menu, Relatórios, Vendas por Cliente]": janela = new RelatorioVendasCliente(this.janelaPrincipal); break;
            case "[Menu, Cubos, Cubo Faturamento]": janela = new JanelaBi(this.janelaPrincipal); break;
//TODO
            default: return null;
        }
        
        this.mapaControleJanelas.put(caminhoTree, Boolean.TRUE);
        return janela;
    }
    
    /**
     * Disponibilizar para que janela possa ser aberta novamente. Passar como parâmetro o caminho desta janela
     * <br>Exemplo:<pre>  "[Menu, Cadastro, Cliente]"</pre>
     * 
     * @param caminhoTree 
     */
    public void liberarJanela(String caminhoTree)
    {
        this.mapaControleJanelas.put(caminhoTree, Boolean.FALSE);
    }
}
